#include "SDL.h"
#include "SDL2pp/SDL2pp.hh"
#include "shapes/circle.h"
#include "shapes/polygon.h"

#include "render_collider.h"
#include "render_shapes.h"
#include "sprite.h"
#include "number.hh"

using namespace uniq::integral_types;

int main(int argc, char* argv[]) {
    // 初始化SDL上下文，窗口和渲染器
    SDL2pp::SDL ctx{SDL_INIT_EVERYTHING};
    SDL2pp::Window window{"TestBed", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN};
    SDL2pp::Renderer renderer{window, -1, SDL_RENDERER_ACCELERATED};
    SDL_Event event;
    auto running = true;

    // 创建两个多边形及其碰撞器
    const auto poly = uniq::polygon<double>{{{100, 100}, {50, 50}, {150, 50}}};               // 三角形
    const auto poly1 = uniq::polygon<double>{{{100, 90}, {120, 80}, {307, 119}, {149, 219}}}; // 四边形
    auto poly_collider = uniq::collider_polygon<double>{poly};
    auto poly_collider1 = uniq::collider_polygon<double>{poly1};

    // 定义变换：xf1向右移动，xf2向左移动
    const auto xf1 = uniq::transform<double>{{1, 0}, 0};
    const auto xf2 = uniq::transform<double>{{-1, 0}, 0};

    // 时间控制变量
    const auto deltaTime = 16LL; // 每帧时间（约60FPS）
    auto runningTime = 0LL;
    auto switch_flag = false; // 控制移动方向的标志

    while (running) {
        // 处理SDL事件
        while (SDL_PollEvent(&event)) {
            switch (static_cast<SDL_EventType>(event.type)) {
            case SDL_QUIT:
                running = false;
                break;
            // 处理鼠标点击事件，检测点击位置是否与多边形碰撞
            case SDL_MOUSEBUTTONDOWN: {
                uniq::vec2<double> pos{static_cast<double>(event.button.x), static_cast<double>(event.button.y)};
                // 检测点击位置是否与第一个多边形碰撞
                if (poly_collider.collide_with(pos)) {
                    std::cerr << "click collide 1";
                }
                // 检测点击位置是否与第二个多边形碰撞
                if (poly_collider1.collide_with(pos)) {
                    std::cerr << "click collide 2";
                }
                break;
            }
            default:
                break;
            }
        }

        // 清屏，设置背景为白色
        renderer.SetDrawColor({0xff, 0xff, 0xff});
        renderer.Clear();

        // 更新运行时间并控制多边形移动方向
        runningTime += deltaTime;
        if (runningTime > 4000) { // 每4秒切换一次方向
            switch_flag = !switch_flag;
            runningTime = 0;
        }

        // 根据标志位移动第二个多边形
        if (switch_flag) {
            poly_collider1.translate(xf1); // 向右移动
        } else {
            poly_collider1.translate(xf2); // 向左移动
        }

        // 检测两个多边形是否碰撞，并根据结果渲染不同颜色
        if (poly_collider.collide_with(poly_collider1) && poly_collider1.collide_with(poly_collider)) {
            // 碰撞时渲染为红色
            render(renderer, poly_collider, {128, 0, 0});
            render(renderer, poly_collider1, {128, 0, 0});
        } else {
            // 未碰撞时渲染为绿色
            render(renderer, poly_collider, {0, 128, 0});
            render(renderer, poly_collider1, {0, 128, 0});
        }

        // 显示渲染结果并延迟以控制帧率
        renderer.Present();
        SDL_Delay(deltaTime);
    }

    return 0;
}